#ifndef CPPUTILS_INCLUDE_H
#define CPPUTILS_INCLUDE_H

#include <unistd.h> 
#include <string>
#include <vector>
#include <map>
#include <cstring>
#include <fstream>
#include <limits.h>

#include <setjmp.h>
#include <signal.h>

using namespace std;

string to_lower(const string& str);

string to_upper(const string& str);

bool IsFastCGI( void );

int stringSplit(const string& str, const string& sep, vector<string> &vec);

void stringSplit(const string& str,
        const string& fstsep,
        const string& secsep,
        map<string,string>& cpqx);

string& trim(string& str, const string& trimStr = " \r\n\t");

inline string getAbsExePath()
{
    char buf[ PATH_MAX] = {0}; 
    readlink( "/proc/self/exe", buf, PATH_MAX);
    return string(buf);
}

inline string getAbsExeDir()
{
    char buf[ PATH_MAX] = {0}; 
    readlink( "/proc/self/exe", buf, PATH_MAX);
    string path(buf);
    size_t pos = path.rfind("/");
    if (pos != string::npos)
        return path.substr(0,pos + 1);

    return "";
}

/* from,to: 通过 iconv --list来查询 */
void charset_conv(const string& input,string& output,const string& from,const string& to);

/*
GetTime中的fmt的意义,各标志符间可以加其他格式符，比如冒号
year:
%y: without a century (range 00 to 99)
%Y: including the century

month:
%m:00-12

day:
%d:01-31
%e:1-31  10以下的有前导空格

hour:
%H:00-23
%k:0-23

minute:
%M:00-59

second:
%S:00-60
其他格式参见 strftime 的说明
*/
string GetTime(const string& fmt);
// 获取一个2014-01-01 01:01:01.234 格式的字符串
string GetTimestamp();

inline string int2a(long val)
{
    char buf[64] = {0};
    sprintf(buf,"%ld",val);
    return string(buf);
}

inline string float2a(double val,const string& fmt)
{
    char buf[64] = {0};
    sprintf(buf,fmt.c_str(),val);
    return string(buf);
}

// 如果包括目录名，目录名后都会带/
void EnumDirFiles(const string& dir, vector<string>& vFiles,bool includeDir = false);

// pids: 执行文件的绝对路径->pids，即一个执行文件，可能被执行了多次
void EnumProcPids(map<string,vector<int> >& pids);

// 以守护进程运行
// return 0 表示成功，小于0失败
int beDaemon();

# endif









